// @before-stub-for-debug-begin
#include <vector>
#include <string>

using namespace std;
// @before-stub-for-debug-end

/*
 * @lc app=leetcode.cn id=83 lang=cpp
 *
 * [83] 删除排序链表中的重复元素
 *
 * https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/description/
 *
 * algorithms
 * Easy (53.69%)
 * Likes:    753
 * Dislikes: 0
 * Total Accepted:    396.9K
 * Total Submissions: 739.8K
 * Testcase Example:  '[1,1,2]'
 *
 * 给定一个已排序的链表的头 head ， 删除所有重复的元素，使每个元素只出现一次 。返回 已排序的链表 。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：head = [1,1,2]
 * 输出：[1,2]
 *
 *
 * 示例 2：
 *
 *
 * 输入：head = [1,1,2,3,3]
 * 输出：[1,2,3]
 *
 *
 *
 *
 * 提示：
 *
 *
 * 链表中节点数目在范围 [0, 300] 内
 * -100 <= Node.val <= 100
 * 题目数据保证链表已经按升序 排列
 *
 *
 */

// @lc code=start
#include <iostream>
using namespace std;
//   Definition for singly-linked list.
/* struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
}; */

class Solution
{
public:
    ListNode *deleteDuplicates(ListNode *head)
    {
        ListNode *p1 = head;
        ListNode *p2 = head;
        if (head == nullptr || head->next == nullptr)
        {
            return head;
        }
        p2 = p1->next;
        while (p2 != nullptr)
        {
                while (p2!=nullptr&&p2->val == p1->val)
                {
                    p2 = p2->next;
                }
            p1->next = p2;
            p1 = p2;
            if (p1 != nullptr)
            {
                p2 = p1->next;
            }
            else
            {
                return head;
            }
        }
        return head;
    }
};
// @lc code=end
